﻿namespace Wxy.Action
{
    /// <summary>
    /// 动作信息，不是动画信息
    /// 一个动作包含若干个动画
    /// </summary>
    public struct ActionInfo
    {
        /// <summary>
        /// 动画id
        /// </summary>
        public string id;

        /// <summary>
        /// 优先级
        /// 一个动作的基础优先级，优先级越高的动作越可能被选中
        /// </summary>
        public int priority;

        /// <summary>
        /// 动画的名字
        /// </summary>
        public string animationName;

        /// <summary>
        /// 对行为的初步分类
        /// </summary>
        public string tag;

        /// <summary>
        /// 这个动作可以取消其他动作的依据（标签）
        /// </summary>
        public CancelledTag[] cancelledTags;

        /// <summary>
        /// 这个动作被其他动作取消的依据（标签）
        /// </summary>
        public BeCancelledTag[] beCancelledTags;

        /// <summary>
        /// 临时被取消的信息，因为攻击过程中会临时开启一些Cancel
        /// </summary>
        public TempCancelledTag[] tempBeCancelledTags;

        /// <summary>
        /// 动作的输入信息，什么输入能够触发这个动作
        /// 又因为动作可以有多个输入，所以是数组
        /// </summary>
        public ActionCommand[] actionCommands;

        /// <summary>
        /// 这里是保持移动方向的倍率，根据游戏不同、精度不同所需要的参数不同
        /// 大多横版游戏这个倍率会有多个值
        /// 这个值的作用是当做这个动作的时候，我继续前进或者后退按照什么倍率来
        /// 在动作游戏中，我们放有些技能，按住前进会向前更多的距离，按住后则会向前较短距离甚至不会向前
        /// 靠的就是这个参数，他的倍率x角色移动速度小于动作本身位移速度，就会导致按住后动作前进距离变短
        /// 大多动作这个值应该都是0，而移动类则是1
        /// 值得注意的是，一个动作的acceptance是阶段性的，比如起跳动作起跳的蹲伏阶段是不能移动的，但是跳起来之后却可以
        /// 如果美术把起跳到最高点做在一个动作了，也问题不大，靠这个来做
        /// 如果策划填表填错了，2段重叠了，那么就取速度慢的那段
        /// </summary>
        public MoveInputAcceptance[] inputAcceptance;

        /// <summary>
        /// 下一个动作的id
        /// 这个id是当动作自然播放完毕之后转向的那个动作，所以必须是一个严格的id
        /// 类似街霸的格斗游戏中，蹲下这个动作的autoNextActionId应该等于站立动作的
        /// 之所以蹲着，是因为按住了下，导致下蹲动作自己cancel了自己，所以保持蹲着
        /// 因为同一个动作cancel自己，虽然会导致逻辑上这个动作从头开始了，但是由于播放动画走的是Update而非逻辑帧，所以播放动作是单独的，他可以继续播放下去
        /// 所以才会看起来蹲是保持的（因为动作是连贯的，而非重新开始播放），但实际上确实是“新动作”，当然动作游戏里面的核心问题还是“下一帧”。
        ///
        /// 同时还有另一个影响，比如我站立着拿刀，收刀切换为斧头，拿着斧头的站立动作是不一样的既半蹲的
        /// 使用这个参数收刀动作会cancel掉普通站立动作，并且下一个自然动作是拿着斧头半蹲的站立动作
        /// </summary>
        public string autoNextActionId;

        /// <summary>
        /// 档切换到自己这个动作的时候，是否保持继续播放
        /// 这个意思是：比如移动会被移动自己cancel，这时候移动动作应该继续播放，而不是重置，所以要有这个true
        /// 原本在帧为单位的时候，cancel关系都是nextFrame所以可以通过frame之间的连接关系来，现在要以动作为单位，就靠这个凑出这个效果了
        /// </summary>
        public bool keepPlayingAnim;

        /// <summary>
        /// 一个动作是否会自动终止
        /// </summary>
        public bool autoTerminate;
        
        /// <summary>
        /// 在这个动作期间存在的攻击信息
        /// </summary>
        public AttackInfo[] attacks;
    }
}